package com.zhoukl.androidRDP.RdpViews.photoview;

import android.graphics.RectF;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.ImageView;

/**
 * Provided default implementation of GestureDetector.OnDoubleTapListener, to be overriden with custom behavior, if needed
 * <p>
 * &nbsp;
 * </p>
 * To be used via {@link com.huika.lib.ui.widget.photoview.PhotoViewAttacher#setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener)}
 */
public class DefaultOnDoubleTapListener implements GestureDetector.OnDoubleTapListener {

	private PhotoViewAttacher photoViewAttacher;

	/**
	 * Default constructor
	 * 
	 * @param photoViewAttacher
	 *            PhotoViewAttacher to bind to
	 */
	public DefaultOnDoubleTapListener(PhotoViewAttacher photoViewAttacher) {
		setPhotoViewAttacher(photoViewAttacher);
	}

	/**
	 * Allows to change PhotoViewAttacher within range of single instance
	 * 
	 * @param newPhotoViewAttacher
	 *            PhotoViewAttacher to bind to
	 */
	public void setPhotoViewAttacher(PhotoViewAttacher newPhotoViewAttacher) {
		this.photoViewAttacher = newPhotoViewAttacher;
	}

	@Override
	public boolean onSingleTapConfirmed(MotionEvent e) {
		if (this.photoViewAttacher == null)
			return false;

		ImageView imageView = photoViewAttacher.getImageView();

		if (null != photoViewAttacher.getOnPhotoTapListener()) {
			final RectF displayRect = photoViewAttacher.getDisplayRect();

			if (null != displayRect) {
				final float x = e.getX(), y = e.getY();

				// Check to see if the user tapped on the photo
				if (displayRect.contains(x, y)) {

					float xResult = (x - displayRect.left) / displayRect.width();
					float yResult = (y - displayRect.top) / displayRect.height();

					photoViewAttacher.getOnPhotoTapListener().onPhotoTap(imageView, xResult, yResult);
					return true;
				}
			}
		}
		if (null != photoViewAttacher.getOnViewTapListener()) {
			photoViewAttacher.getOnViewTapListener().onViewTap(imageView, e.getX(), e.getY());
		}

		return false;
	}

	@Override
	public boolean onDoubleTap(MotionEvent ev) {
		if (photoViewAttacher == null)
			return false;

		try {
			float scale = photoViewAttacher.getScale();
			float x = ev.getX();
			float y = ev.getY();

			if (scale < photoViewAttacher.getMediumScale()) {
				photoViewAttacher.setScale(photoViewAttacher.getMediumScale(), x, y, true);
			}
			else if (scale >= photoViewAttacher.getMediumScale() && scale < photoViewAttacher.getMaximumScale()) {
				photoViewAttacher.setScale(photoViewAttacher.getMaximumScale(), x, y, true);
			}
			else {
				photoViewAttacher.setScale(photoViewAttacher.getMinimumScale(), x, y, true);
			}
		}
		catch (ArrayIndexOutOfBoundsException e) {
			// Can sometimes happen when getX() and getY() is called
		}

		return true;
	}

	@Override
	public boolean onDoubleTapEvent(MotionEvent e) {
		// Wait for the confirmed onDoubleTap() instead
		return false;
	}

}
